// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

using System.Collections.Generic;
using System.Linq;
using Microsoft.PowerFx.Core.Utils;

namespace Microsoft.PowerFx.Core.Types.Enums
{
    internal static class ColorTable
    {
        // There is a copy of this dictionary in \js\AppMagic.Common\Utility\ColorUtility.ts under the name _colorTable
        // So to keep things consistent all changes should be done in both the places.
        // Transparent is "Transparent Black" consistent with w3c CSS color module level 3 definition (https://www.w3.org/TR/css-color-3/#transparent)
        private static readonly Dictionary<string, uint> _invariantNameToHexMap =
            new Dictionary<string, uint> {
                {"AliceBlue", 0xFFF0F8FF}, {"AntiqueWhite", 0xFFFAEBD7}, {"Aqua", 0xFF00FFFF}, {"Aquamarine", 0xFF7FFFD4}, {"Azure", 0xFFF0FFFF}, {"Beige", 0xFFF5F5DC}, { "Bisque", 0xFFFFE4C4},
                {"Black", 0xFF000000}, {"BlanchedAlmond", 0xFFFFEBCD}, {"Blue", 0xFF0000FF}, {"BlueViolet", 0xFF8A2BE2}, {"Brown", 0xFFA52A2A}, {"BurlyWood", 0xFFDEB887}, {"CadetBlue", 0xFF5F9EA0},
                {"Chartreuse", 0xFF7FFF00}, {"Chocolate", 0xFFD2691E}, {"Coral", 0xFFFF7F50}, {"CornflowerBlue", 0xFF6495ED}, {"Cornsilk", 0xFFFFF8DC}, {"Crimson", 0xFFDC143C}, {"Cyan", 0xFF00FFFF},
                {"DarkBlue", 0xFF00008B}, {"DarkCyan", 0xFF008B8B}, {"DarkGoldenRod", 0xFFB8860B}, {"DarkGray", 0xFFA9A9A9}, {"DarkGreen", 0xFF006400}, {"DarkKhaki", 0xFFBDB76B}, {"DarkMagenta", 0xFF8B008B},
                {"DarkOliveGreen", 0xFF556B2F}, {"DarkOrange", 0xFFFF8C00}, {"DarkOrchid", 0xFF9932CC}, {"DarkRed", 0xFF8B0000}, {"DarkSalmon", 0xFFE9967A}, {"DarkSeaGreen", 0xFF8FBC8F}, {"DarkSlateBlue", 0xFF483D8B},
                {"DarkSlateGray", 0xFF2F4F4F}, {"DarkTurquoise", 0xFF00CED1}, {"DarkViolet", 0xFF9400D3}, {"DeepPink", 0xFFFF1493}, {"DeepSkyBlue", 0xFF00BFFF}, {"DimGray", 0xFF696969}, {"DimGrey", 0xFF696969},
                {"DodgerBlue", 0xFF1E90FF}, {"FireBrick", 0xFFB22222}, {"FloralWhite", 0xFFFFFAF0}, {"ForestGreen", 0xFF228B22}, {"Fuchsia", 0xFFFF00FF}, {"Gainsboro", 0xFFDCDCDC}, {"GhostWhite", 0xFFF8F8FF},
                {"Gold", 0xFFFFD700}, {"GoldenRod", 0xFFDAA520}, {"Gray", 0xFF808080}, {"Green", 0xFF008000}, {"GreenYellow", 0xFFADFF2F}, {"HoneyDew", 0xFFF0FFF0}, {"HotPink", 0xFFFF69B4},
                {"IndianRed", 0xFFCD5C5C}, {"Indigo", 0xFF4B0082}, {"Ivory", 0xFFFFFFF0}, {"Khaki", 0xFFF0E68C}, {"Lavender", 0xFFE6E6FA}, {"LavenderBlush", 0xFFFFF0F5}, {"LawnGreen", 0xFF7CFC00},
                {"LemonChiffon", 0xFFFFFACD}, {"LightBlue", 0xFFADD8E6}, {"LightCoral", 0xFFF08080}, {"LightCyan", 0xFFE0FFFF}, {"LightGoldenRodYellow", 0xFFFAFAD2}, {"LightGray", 0xFFD3D3D3}, {"LightGreen", 0xFF90EE90},
                {"LightPink", 0xFFFFB6C1}, {"LightSalmon", 0xFFFFA07A}, {"LightSeaGreen", 0xFF20B2AA}, {"LightSkyBlue", 0xFF87CEFA}, {"LightSlateGray", 0xFF778899}, {"LightSteelBlue", 0xFFB0C4DE},
                {"LightYellow", 0xFFFFFFE0}, {"Lime", 0xFF00FF00}, {"LimeGreen", 0xFF32CD32}, {"Linen", 0xFFFAF0E6}, {"Magenta", 0xFFFF00FF}, {"Maroon", 0xFF800000}, {"MediumAquaMarine", 0xFF66CDAA},
                {"MediumBlue", 0xFF0000CD}, {"MediumOrchid", 0xFFBA55D3}, {"MediumPurple", 0xFF9370DB}, {"MediumSeaGreen", 0xFF3CB371}, {"MediumSlateBlue", 0xFF7B68EE}, {"MediumSpringGreen", 0xFF00FA9A},
                {"MediumTurquoise", 0xFF48D1CC}, {"MediumVioletRed", 0xFFC71585}, {"MidnightBlue", 0xFF191970}, {"MintCream", 0xFFF5FFFA}, {"MistyRose", 0xFFFFE4E1}, {"Moccasin", 0xFFFFE4B5}, {"NavajoWhite", 0xFFFFDEAD},
                {"Navy", 0xFF000080}, {"OldLace", 0xFFFDF5E6}, {"Olive", 0xFF808000}, {"OliveDrab", 0xFF6B8E23}, {"Orange", 0xFFFFA500}, {"OrangeRed", 0xFFFF4500}, {"Orchid", 0xFFDA70D6}, {"PaleGoldenRod", 0xFFEEE8AA},
                {"PaleGreen", 0xFF98FB98}, {"PaleTurquoise", 0xFFAFEEEE}, {"PaleVioletRed", 0xFFDB7093}, {"PapayaWhip", 0xFFFFEFD5}, {"PeachPuff", 0xFFFFDAB9}, {"Peru", 0xFFCD853F}, {"Pink", 0xFFFFC0CB}, {"Plum", 0xFFDDA0DD},
                {"PowderBlue", 0xFFB0E0E6}, {"Purple", 0xFF800080}, {"Red", 0xFFFF0000}, {"RosyBrown", 0xFFBC8F8F}, {"RoyalBlue", 0xFF4169E1}, {"SaddleBrown", 0xFF8B4513}, {"Salmon", 0xFFFA8072}, {"SandyBrown", 0xFFF4A460},
                {"SeaGreen", 0xFF2E8B57}, {"SeaShell", 0xFFFFF5EE}, {"Sienna", 0xFFA0522D}, {"Silver", 0xFFC0C0C0}, {"SkyBlue", 0xFF87CEEB}, {"SlateBlue", 0xFF6A5ACD}, {"SlateGray", 0xFF708090}, {"Snow", 0xFFFFFAFA},
                {"SpringGreen", 0xFF00FF7F}, {"SteelBlue", 0xFF4682B4}, {"Tan", 0xFFD2B48C}, {"Teal", 0xFF008080}, {"Thistle", 0xFFD8BFD8}, {"Tomato", 0xFFFF6347}, {"Transparent", 0}, {"Turquoise", 0xFF40E0D0}, {"Violet", 0xFFEE82EE},
                {"Wheat", 0xFFF5DEB3}, {"White", 0xFFFFFFFF}, {"WhiteSmoke", 0xFFF5F5F5}, {"Yellow", 0xFFFFFF00}, {"YellowGreen", 0xFF9ACD32}
            };

        public static Dictionary<string, uint> InvariantNameToHexMap => _invariantNameToHexMap;

        internal static new string ToString()
        {
            Contracts.Assert(_invariantNameToHexMap.All(x => !CharacterUtils.HasSpaces(x.Key)));

            var colorText = string.Join(", ", _invariantNameToHexMap.Select(x => x.Key + ":#" + string.Format("{0:X6}", x.Value)));
            return "%c[" + colorText + "]";
        }
    }
}